package redis

import (
	"os"
	"time"
)

type Conf struct {
}
type Server struct {
}
type Application struct {
	server *Server
	conf   *Conf
}

type Handler interface {
	Start() error
	Handel()
	Close()
}
type Handler_ struct {
}

type Parser interface {
}
type Parser_ struct {
}

type DB interface {
	Do()
	Close()
}
type DBTrigger struct {
	executor Executor
}
type Executor interface {
}
type DBExecutor struct {
	ch          chan *Command
	cmdHandlers map[CmdType]CmdHandler
	dataStore   DataStore
	gcTricker   *time.Ticker
}

type DataStore interface {
	// ...
	// 过期相关指令
	GC()
	Expire(*Command) handler.Reply
	ExpireAt(*Command) handler.Reply
	// string 数据类型
	Get(*Command) handler.Reply
	Set(*Command) handler.Reply
	// ...
	// list 数据类型
	LPush(*Command) handler.Reply
	// ...
	// set 数据类型
	SAdd(*Command) handler.Reply
	// ...
	// hashmap 数据类型
	HSet(*Command) handler.Reply
	// ...
	// sortedset 数据类型
	ZAdd(*Command) handler.Reply
	// ...
}
type KVStore struct {
	// 实际存储数据的 map
	data map[string]interface{}
	// 记录 key 过期时间的 map
	expiredAt map[string]time.Time
	// 执行 key 过期回收任务的时间轮
	expireTimeWheel SortedSet
	// 数据持久化模块
	persister handler.Persister
}

type Persister interface {
	// 加载持久化数据的 loader
	Reloader() (io.ReadCloser, error)
	// 对指令进行持久化
	PersistCmd(ctx context.Context, cmd [][]byte)
	Close()
}
type aofPersister struct {
	// ...
	// 接收持久化指令的通道
	buffer chan [][]byte
	// aof 文件
	aofFile *os.File
	// aof 文件名
	aofFileName string
	// aof 持久化策略
	appendFsync appendSyncStrategy
	// aof 重写策略
	autoAofRewriteAfterCmd int64
	aofCounter             atomic.Int64

	// ...
}
